/*
 * Copyright 2023 The Android Open Source Project
 * Copyright 2009 Sonic Network Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package androidx.media3.decoder.midi;

import static androidx.media3.common.util.Assertions.checkArgument;
import static androidx.media3.common.util.Assertions.checkStateNotNull;
import static java.lang.Math.max;

import android.content.Context;
import androidx.media3.common.util.UnstableApi;
import com.google.common.io.BaseEncoding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/** General MIDI Instrument library extracted from Sonivox library in Android file "wt_22khz.c". */
@UnstableApi
/* package */ final class SonivoxWaveData {

  public static class WavetableRegion {
    private static final int REGION_FLAG_IS_LOOPED = 0x01;
    private static final int REGION_FLAG_USE_NOISE_GENERATOR = 0x02;
    private static final int REGION_FLAG_IS_LAST = 0x8000;

    public final int loopStart;
    public final int loopEnd;
    public final int waveIndex;
    public final int artIndex;
    public final int keyGroupAndFlags;
    public final byte rangeLow;
    public final byte rangeHigh;
    public final short tuning;
    public final short gain;

    public WavetableRegion(
        int loopStart,
        int loopEnd,
        int waveIndex,
        int artIndex,
        int keyGroupAndFlags,
        byte rangeLow,
        byte rangeHigh,
        short tuning,
        short gain) {
      this.loopStart = loopStart;
      this.loopEnd = loopEnd;
      this.waveIndex = waveIndex;
      this.artIndex = artIndex;
      this.keyGroupAndFlags = keyGroupAndFlags;
      this.rangeLow = rangeLow;
      this.rangeHigh = rangeHigh;
      this.tuning = tuning;
      this.gain = gain;
    }

    public boolean useNoise() {
      return (keyGroupAndFlags & REGION_FLAG_USE_NOISE_GENERATOR) != 0;
    }

    public boolean isLooped() {
      return (keyGroupAndFlags & REGION_FLAG_IS_LOOPED) != 0;
    }

    public boolean isLast() {
      return (keyGroupAndFlags & REGION_FLAG_IS_LAST) != 0;
    }

    public boolean isNoteInRange(int noteNumber) {
      return rangeLow <= noteNumber && rangeHigh >= noteNumber;
    }
  }

  private static final int REGION_NUM_VALUES = 9;
  private static final int ARTICULATION_NUM_VALUES = 17;
  private static final int SONIVOX_SAMPLE_RATE = 22050;

  /**
   * Loads the wave table data from file {@code sonivox_byte_wave.dat} which must be bundled in
   * assets.
   *
   * @param context The application context.
   * @return The wave table data.
   * @throws MidiDecoderException If there is an error while loading the file.
   */
  public static short[] loadWaveTableData(Context context) throws MidiDecoderException {
    byte[] bytes = loadWaveTableFile(context);
    // Use last offset and size to allocate the sample array. It is not clear why but Sonivox does
    // this.
    int numBytesWaveSizes =
        WAVE_OFFSETS[WAVE_OFFSETS.length - 1] + WAVES_SIZES[WAVES_SIZES.length - 1];
    int numSamples = max(bytes.length, numBytesWaveSizes);
    short[] waveTableData = new short[numSamples];
    for (int i = 0; i < bytes.length; i++) {
      // Extend to 16-bits.
      waveTableData[i] = (short) (bytes[i] << 8);
    }
    return waveTableData;
  }

  private static byte[] loadWaveTableFile(Context context) throws MidiDecoderException {
    try (InputStream inputStream =
        checkStateNotNull(context.getAssets().open("sonivox_wave_data.dat"))) {
      StringBuilder fileContents = new StringBuilder();
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
      String line;
      while ((line = reader.readLine()) != null) {
        if (line.startsWith("/") || line.startsWith(" ")) {
          continue;
        }
        fileContents.append(line);
      }
      return BaseEncoding.base16().decode(fileContents.toString());
    } catch (IOException e) {
      throw new MidiDecoderException("Could not load wave table data", e);
    }
  }

  public static String[] getProgramNames() {
    return new String[] {
      // Index 0 is called program "1" by musicians.
      /* 1 */ "Acoustic Grand",
      /* 2 */ "Bright Acoustic",
      /* 3 */ "Electric Grand",
      /* 4 */ "Honky-Tonk",
      /* 5 */ "Electric Piano 1",
      /* 6 */ "Electric Piano 2",
      /* 7 */ "Harpsichord",
      /* 8 */ "Clav",
      /* 9 */ "Celesta",
      /* 10 */ "Glockenspiel",
      /* 11 */ "Music Box",
      /* 12 */ "Vibraphone",
      /* 13 */ "Marimba",
      /* 14 */ "Xylophone",
      /* 15 */ "Tubular Bells",
      /* 16 */ "Dulcimer",
      /* 17 */ "Drawbar Organ",
      /* 18 */ "Percussive Organ",
      /* 19 */ "Rock Organ",
      /* 20 */ "Church Organ",
      /* 21 */ "Reed Organ",
      /* 22 */ "Accordian",
      /* 23 */ "Harmonica",
      /* 24 */ "Tango Accordian",
      /* 25 */ "Acoustic Guitar(nylon)",
      /* 26 */ "Acoustic Guitar(steel)",
      /* 27 */ "Electric Guitar(jazz)",
      /* 28 */ "Electric Guitar(clean)",
      /* 29 */ "Electric Guitar(muted)",
      /* 30 */ "Overdriven Guitar",
      /* 31 */ "Distortion Guitar",
      /* 32 */ "Guitar Harmonics",
      /* 33 */ "Acoustic Bass",
      /* 34 */ "Electric Bass(finger)",
      /* 35 */ "Electric Bass(pick)",
      /* 36 */ "Fretless Bass",
      /* 37 */ "Slap Bass 1",
      /* 38 */ "Slap Bass 2",
      /* 39 */ "Synth Bass 1",
      /* 40 */ "Synth Bass 2",
      /* 41 */ "Violin",
      /* 42 */ "Viola",
      /* 43 */ "Cello",
      /* 44 */ "Contrabass",
      /* 45 */ "Tremolo Strings",
      /* 46 */ "Pizzicato Strings",
      /* 47 */ "Orchestral Harp",
      /* 48 */ "Timpani",
      /* 49 */ "String Ensembles 1",
      /* 50 */ "String Ensembles 2",
      /* 51 */ "SynthStrings 1",
      /* 52 */ "SynthStrings 2",
      /* 53 */ "Choir Aahs",
      /* 54 */ "Voice Oohs",
      /* 55 */ "Synth Voice",
      /* 56 */ "Orchestra Hit",
      /* 57 */ "Trumpet",
      /* 58 */ "Trombone",
      /* 59 */ "Tuba",
      /* 60 */ "Muted Trumpet",
      /* 61 */ "French Horn",
      /* 62 */ "Brass Section",
      /* 63 */ "SynthBrass 1",
      /* 64 */ "SynthBrass 2",
      /* 65 */ "Soprano Sax",
      /* 66 */ "Alto Sax",
      /* 67 */ "Tenor Sax",
      /* 68 */ "Baritone Sax",
      /* 69 */ "Oboe",
      /* 70 */ "English Horn",
      /* 71 */ "Bassoon",
      /* 72 */ "Clarinet",
      /* 73 */ "Piccolo",
      /* 74 */ "Flute",
      /* 75 */ "Recorder",
      /* 76 */ "Pan Flute",
      /* 77 */ "Blown Bottle",
      /* 78 */ "Skakuhachi",
      /* 79 */ "Whistle",
      /* 80 */ "Ocarina",
      /* 81 */ "Lead 1 (square)",
      /* 82 */ "Lead 2 (sawtooth)",
      /* 83 */ "Lead 3 (calliope)",
      /* 84 */ "Lead 4 (chiff)",
      /* 85 */ "Lead 5 (charang)",
      /* 86 */ "Lead 6 (voice)",
      /* 87 */ "Lead 7 (fifths)",
      /* 88 */ "Lead 8 (bass+lead)",
      /* 89 */ "Pad 1 (new age)",
      /* 90 */ "Pad 2 (warm)",
      /* 91 */ "Pad 3 (polysynth)",
      /* 92 */ "Pad 4 (choir)",
      /* 93 */ "Pad 5 (bowed)",
      /* 94 */ "Pad 6 (metallic)",
      /* 95 */ "Pad 7 (halo)",
      /* 96 */ "Pad 8 (sweep)",
      /* 97 */ "FX 1 (rain)",
      /* 98 */ "FX 2 (soundtrack)",
      /* 99 */ "FX 3 (crystal)",
      /* 100 */ "FX 4 (atmosphere)",
      /* 101 */ "FX 5 (brightness)",
      /* 102 */ "FX 6 (goblins)",
      /* 103 */ "FX 7 (echoes)",
      /* 104 */ "FX 8 (sci-fi)",
      /* 105 */ "Sitar",
      /* 106 */ "Banjo",
      /* 107 */ "Shamisen",
      /* 108 */ "Koto",
      /* 109 */ "Kalimba",
      /* 110 */ "Bagpipe",
      /* 111 */ "Fiddle",
      /* 112 */ "Shanai",
      /* 113 */ "Tinkle Bell",
      /* 114 */ "Agogo",
      /* 115 */ "Steel Drums",
      /* 116 */ "Woodblock",
      /* 117 */ "Taiko Drum",
      /* 118 */ "Melodic Tom",
      /* 119 */ "Synth Drum",
      /* 120 */ "Reverse Cymbal",
      /* 121 */ "Guitar Fret Noise",
      /* 122 */ "Breath Noise",
      /* 123 */ "Seashore",
      /* 124 */ "Bird Tweet",
      /* 125 */ "Telephone Ring",
      /* 126 */ "Helicopter",
      /* 127 */ "Applause",
      /* 128 */ "Gunshot",
      /* 0x80 is special program for GM2 drum channels */ "Rhythm"
    };
  }

  public static WavetableRegion extractRegion(int index) {
    int cursor = index * REGION_NUM_VALUES;
    int keyGroupAndFlags = EAS_REGIONS[cursor++];
    byte rangeLow = (byte) EAS_REGIONS[cursor++];
    byte rangeHigh = (byte) EAS_REGIONS[cursor++];
    short tuning = (short) EAS_REGIONS[cursor++];
    short gain = (short) EAS_REGIONS[cursor++];
    int loopStart = EAS_REGIONS[cursor++];
    int loopEnd = EAS_REGIONS[cursor++];
    int waveIndex = EAS_REGIONS[cursor++];
    int artIndex = EAS_REGIONS[cursor];
    return new WavetableRegion(
        loopStart,
        loopEnd,
        waveIndex,
        artIndex,
        keyGroupAndFlags,
        rangeLow,
        rangeHigh,
        tuning,
        gain);
  }

  public static class Envelope {
    public final short attackTime; // Add to gain every 128 samples, 0 to 32767
    public final short decayTime; // 1.15 scaler for gain every 128 samples
    public final short sustainLevel; // Gain from 0 to 32767
    public final short releaseTime; // 1.15 scaler for gain every 128 samples

    public Envelope(short attackTime, short decayTime, short sustainLevel, short releaseTime) {
      checkArgument(attackTime != 0); // used later as denominator
      this.attackTime = attackTime;
      this.decayTime = decayTime;
      this.sustainLevel = sustainLevel;
      this.releaseTime = releaseTime;
    }

    /**
     * From Sonivox Code: attackTime is the fixed-point integer value from the Sonivox instrument.
     * (attackTime/32768) * (T*SR/128) = 1.0 // 0 to full scale in T seconds (T*SR/128) = 1.0 /
     * (attackTime/32768) T = 128 * 32768 / SR * attackTime
     */
    public double getAttackTimeInSeconds() {
      double numerator = 128L * 32768;
      int denominator = SONIVOX_SAMPLE_RATE * attackTime;
      double time = numerator / denominator;
      // Do not use less than 5 msec because it will be too clicky.
      return max(0.005, time);
    }

    public double getDecayTimeInSeconds() {
      return convertScalerToSeconds(decayTime);
    }

    public double getReleaseTimeInSeconds() {
      return max(0.02, convertScalerToSeconds(releaseTime));
    }

    public double getSustainLevel() {
      return sustainLevel * (1.0 / 32768);
    }

    /**
     * Based on a reverse engineering of the Sonivox code. (decayTime / 32768)^(T*SR/128) = -90dB
     * log((decayTime / 32768)^(T*SR/128)) = log(DB90) (T*SR/128) * log(decayTime / 32768) =
     * log(DB90) (T*SR/128) * log(decayTime / 32768) = log(1.0/32768) T = log(1.0/32768) * 128 / (SR
     * * log(decayTime/32768)
     */
    private static double convertScalerToSeconds(int scaler) {
      double numerator = Math.log(1.0 / 32768) * 128;
      double denominator = SONIVOX_SAMPLE_RATE * Math.log(scaler / 32768.0);
      return numerator / denominator;
    }
  }

  public static class Articulation {
    public final Envelope eg1;
    public final Envelope eg2;
    public final short lfoToPitch; // pitchCents += lfo * lfoToPitch / 32768.0
    public final short lfoDelay; // T = lfoDelay * 128 / SR
    public final short lfoFreq; // phaseIncrement = lfoFreq*128 from 0 to 32767
    public final short eg2ToPitch; // pitchCents += eg2 * eg2ToPitch / 32768.0
    public final short eg2ToFc; // pitchCents += eg2 * eg2ToFc / 32768.0
    public final short filterCutoff; // pitchCents
    public final byte lfoToGain; // logarithmic
    public final short filterQ;
    public final byte pan;

    public Articulation(
        Envelope eg1,
        Envelope eg2,
        short lfoToPitch,
        short lfoDelay,
        short lfoFreq,
        short eg2ToPitch,
        short eg2ToFc,
        short filterCutoff,
        byte lfoToGain,
        short filterQ,
        byte pan) {
      this.eg1 = eg1;
      this.eg2 = eg2;
      this.lfoToPitch = lfoToPitch;
      this.lfoDelay = lfoDelay;
      this.lfoFreq = lfoFreq;
      this.eg2ToPitch = eg2ToPitch;
      this.eg2ToFc = eg2ToFc;
      this.filterCutoff = filterCutoff;
      this.lfoToGain = lfoToGain;
      this.filterQ = filterQ;
      this.pan = pan;
    }
  }

  public static Articulation extractArticulation(int index) {
    int cursor = index * ARTICULATION_NUM_VALUES;
    // Extraction order must match the order of the members of the structure.
    return new Articulation(
        /* eg1= */ new Envelope(
            /* attackTime= */ EAS_ARTICULATIONS[cursor++],
            /* decayTime= */ EAS_ARTICULATIONS[cursor++],
            /* sustainLevel= */ EAS_ARTICULATIONS[cursor++],
            /* releaseTime= */ EAS_ARTICULATIONS[cursor++]),
        /* eg2= */ new Envelope(
            /* attackTime= */ EAS_ARTICULATIONS[cursor++],
            /* decayTime= */ EAS_ARTICULATIONS[cursor++],
            /* sustainLevel= */ EAS_ARTICULATIONS[cursor++],
            /* releaseTime= */ EAS_ARTICULATIONS[cursor++]),
        /* lfoToPitch= */ EAS_ARTICULATIONS[cursor++],
        /* lfoDelay= */ EAS_ARTICULATIONS[cursor++],
        /* lfoFreq= */ EAS_ARTICULATIONS[cursor++],
        /* eg2ToPitch= */ EAS_ARTICULATIONS[cursor++],
        /* eg2ToFc= */ EAS_ARTICULATIONS[cursor++],
        /* filterCutoff= */ EAS_ARTICULATIONS[cursor++],
        /* lfoToGain= */ (byte) EAS_ARTICULATIONS[cursor++],
        /* filterQ= */ EAS_ARTICULATIONS[cursor++],
        /* pan= */ (byte) EAS_ARTICULATIONS[cursor]);
  }

  public static int getProgramRegion(int index) {
    return PROGRAM_REGIONS[index];
  }

  private static final int[] PROGRAM_REGIONS = {
    291, 324, 314, 334, 202, 319, 95, 195, // 0
    107, 92, 371, 89, 87, 85, 135, 82, // 8
    200, 192, 130, 267, 193, 302, 207, 210,
    128, 125, 190, 120, 118, 213, 221, 271,
    80, 78, 308, 164, 220, 310, 166, 167, // 32
    186, 182, 181, 179, 160, 178, 176, 115,
    155, 153, 151, 149, 75, 73, 374, 111,
    252, 254, 258, 305, 256, 157, 146, 137,
    249, 237, 245, 241, 274, 262, 260, 265, // 64
    172, 171, 309, 277, 284, 307, 136, 344,
    173, 168, 345, 353, 346, 70, 110, 311,
    357, 144, 104, 67, 364, 367, 64, 288,
    142, 140, 98, 355, 133, 123, 61, 113, // 96
    285, 280, 279, 278, 370, 286, 359, 283,
    101, 236, 163, 235, 234, 233, 232, 231,
    162, 363, 230, 281, 165, 229, 109, 228,
    0 // start of rhythm regions
  };

  public static int getWaveSize(int index) {
    return WAVES_SIZES[index];
  }

  private static final int[] WAVES_SIZES = {
    16820, 16708, 16592, 11754, 10954, 10295, 9922, 7489,
    5779, 5462, 4452, 3779, 3115, 3093, 3057, 3024,
    2818, 2776, 2171, 2168, 2052, 1902, 1835, 1614,
    1603, 1528, 1517, 1480, 1455, 1424, 1387, 1302,
    1262, 1254, 1230, 1227, 1185, 1181, 1178, 1168,
    1132, 1120, 1034, 1033, 1018, 994, 964, 926,
    907, 886, 881, 866, 830, 817, 816, 813,
    749, 748, 739, 720, 652, 610, 610, 583,
    564, 561, 556, 549, 542, 535, 530, 530,
    516, 508, 492, 478, 461, 448, 437, 431,
    423, 418, 403, 402, 400, 394, 387, 387,
    367, 357, 347, 347, 341, 336, 334, 329,
    325, 312, 294, 284, 277, 265, 255, 233,
    230, 213, 207, 205, 194, 193, 184, 181,
    181, 167, 164, 158, 152, 152, 145, 139,
    128, 103, 100, 88, 87, 84, 84, 72,
    71, 55, 46, 45, 43, 40, 40, 40,
    37, 35, 32, 32, 30, 29, 27, 23,
    22, 21, 21, 21, 21, 20
  };

  public static int getWaveCount() {
    return WAVE_OFFSETS.length;
  }

  public static int getWaveOffset(int index) {
    return WAVE_OFFSETS[index];
  }

  private static final int[] WAVE_OFFSETS = {
    0x00000000,
    0x000041b4,
    0x000082f8,
    0x0000c3c8,
    0x0000f1b2,
    0x00011c7c,
    0x000144b3,
    0x00016b75, // 0
    0x000188b6,
    0x00019f49,
    0x0001b49f,
    0x0001c603,
    0x0001d4c6,
    0x0001e0f1,
    0x0001ed06,
    0x0001f8f7, // 8
    0x000204c7,
    0x00020fc9,
    0x00021aa1,
    0x0002231c,
    0x00022b94,
    0x00023398,
    0x00023b06,
    0x00024231, // 16
    0x0002487f,
    0x00024ec2,
    0x000254ba,
    0x00025aa7,
    0x0002606f,
    0x0002661e,
    0x00026bae,
    0x00027119,
    0x0002762f,
    0x00027b1d,
    0x00028003,
    0x000284d1,
    0x0002899c,
    0x00028e3d,
    0x000292da,
    0x00029774, // 32
    0x00029c04,
    0x0002a070,
    0x0002a4d0,
    0x0002a8da,
    0x0002ace3,
    0x0002b0dd,
    0x0002b4bf,
    0x0002b883,
    0x0002bc21,
    0x0002bfac,
    0x0002c322,
    0x0002c693,
    0x0002c9f5,
    0x0002cd33,
    0x0002d064,
    0x0002d394,
    0x0002d6c1,
    0x0002d9ae,
    0x0002dc9a,
    0x0002df7d,
    0x0002e24d,
    0x0002e4d9,
    0x0002e73b,
    0x0002e99d,
    0x0002ebe4,
    0x0002ee18,
    0x0002f049,
    0x0002f275,
    0x0002f49a,
    0x0002f6b8,
    0x0002f8cf,
    0x0002fae1, // 64
    0x0002fcf3,
    0x0002fef7,
    0x000300f3,
    0x000302df,
    0x000304bd,
    0x0003068a,
    0x0003084a,
    0x000309ff,
    0x00030bae,
    0x00030d55,
    0x00030ef7,
    0x0003108a,
    0x0003121c,
    0x000313ac,
    0x00031536,
    0x000316b9,
    0x0003183c,
    0x000319ab,
    0x00031b10,
    0x00031c6b,
    0x00031dc6,
    0x00031f1b,
    0x0003206b,
    0x000321b9,
    0x00032302,
    0x00032447,
    0x0003257f,
    0x000326a5,
    0x000327c1,
    0x000328d6,
    0x000329df,
    0x00032ade,
    0x00032bc7,
    0x00032cad,
    0x00032d82,
    0x00032e51,
    0x00032f1e,
    0x00032fe0,
    0x000330a1,
    0x00033159,
    0x0003320e,
    0x000332c3,
    0x0003336a,
    0x0003340e,
    0x000334ac,
    0x00033544,
    0x000335dc,
    0x0003366d,
    0x000336f8,
    0x00033778,
    0x000337df,
    0x00033843,
    0x0003389b,
    0x000338f2,
    0x00033946,
    0x0003399a,
    0x000339e2,
    0x00033a29,
    0x00033a60,
    0x00033a8e,
    0x00033abb,
    0x00033ae6,
    0x00033b0e,
    0x00033b36, // 128
    0x00033b5e,
    0x00033b83,
    0x00033ba6,
    0x00033bc6,
    0x00033be6,
    0x00033c04,
    0x00033c21,
    0x00033c3c, // 136-143
    0x00033c53,
    0x00033c69,
    0x00033c7e,
    0x00033c93,
    0x00033ca8,
    0x00033cbd // 144-149
  };

  /**
   * This region data is stored as integers in a big uniform array. Region objects can be built from
   * this array.
   */
  private static final int[] EAS_REGIONS = {
    // keyGroupAndFlags, rangeLow, rangeHigh, tuning, gain, loopStart, loopEnd, waveIndex, artIndex
    0, 27, 27, -2868, 16422, 0, 0, 81, 0, /* region 0 */
    0, 28, 28, -3568, 32767, 0, 0, 40, 0, /* region 1 */
    0, 29, 29, -4553, 32767, 0, 0, 32, 1, /* region 2 */
    0, 30, 30, -4853, 32767, 0, 0, 32, 2, /* region 3 */
    0, 31, 31, -3868, 23197, 0, 0, 48, 3, /* region 4 */
    1536, 32, 32, -3200, 20675, 0, 0, 137, 4, /* region 5 */
    1537, 33, 33, -3703, 20675, 792, 879, 50, 5, /* region 6 */
    1537, 34, 34, -3803, 16422, 792, 879, 50, 6, /* region 7 */
    0, 35, 35, -4968, 32767, 0, 0, 83, 7, /* region 8 */
    0, 36, 36, -4968, 32767, 0, 0, 83, 7, /* region 9 */
    0, 37, 37, -4051, 18426, 0, 0, 53, 8, /* region 10 */
    0, 38, 38, -4151, 23197, 0, 0, 16, 9, /* region 11 */
    0, 39, 39, -3568, 32767, 0, 0, 40, 10, /* region 12 */
    0, 40, 40, -4151, 23197, 0, 0, 16, 4, /* region 13 */
    1, 41, 41, -5855, 26028, 798, 993, 45, 11, /* region 14 */
    257, 42, 42, -4200, 26028, 4288, 7488, 7, 12, /* region 15 */
    1, 43, 43, -5755, 26028, 798, 993, 45, 13, /* region 16 */
    257, 44, 44, -4400, 26028, 4288, 7488, 7, 14, /* region 17 */
    1, 45, 45, -5755, 26028, 798, 993, 45, 15, /* region 18 */
    257, 46, 46, -4600, 26028, 4288, 7488, 7, 16, /* region 19 */
    1, 47, 47, -5455, 26028, 798, 993, 45, 17, /* region 20 */
    1, 48, 48, -5355, 26028, 798, 993, 45, 18, /* region 21 */
    1, 49, 49, -5200, 16422, 1294, 5778, 8, 19, /* region 22 */
    1, 50, 50, -5255, 26028, 798, 993, 45, 20, /* region 23 */
    1, 51, 51, -5268, 16422, 6592, 9921, 6, 21, /* region 24 */
    1, 52, 52, -5600, 32767, 1294, 5778, 8, 22, /* region 25 */
    1, 53, 53, -5418, 14636, 6592, 9921, 6, 23, /* region 26 */
    0, 54, 54, -5751, 26028, 0, 0, 39, 24, /* region 27 */
    1, 55, 55, -5300, 32767, 1294, 5778, 8, 25, /* region 28 */
    0, 56, 56, -7255, 32767, 0, 0, 90, 26, /* region 29 */
    1, 57, 57, -5700, 32767, 1294, 5778, 8, 27, /* region 30 */
    1, 58, 58, -7053, 23197, 0, 166, 113, 28, /* region 31 */
    1, 59, 59, -5968, 16422, 6592, 9921, 6, 29, /* region 32 */
    1, 60, 60, -6453, 23197, 432, 582, 63, 30, /* region 33 */
    1, 61, 61, -6853, 16422, 432, 582, 63, 30, /* region 34 */
    1, 62, 62, -7253, 20675, 432, 582, 63, 31, /* region 35 */
    1, 63, 63, -7353, 23197, 432, 582, 63, 32, /* region 36 */
    1, 64, 64, -7953, 23197, 432, 582, 63, 33, /* region 37 */
    0, 65, 65, -7555, 32767, 0, 0, 14, 34, /* region 38 */
    0, 66, 66, -7955, 20675, 0, 0, 14, 34, /* region 39 */
    512, 67, 67, -7155, 18426, 0, 0, 90, 35, /* region 40 */
    512, 68, 68, -7755, 18426, 0, 0, 90, 35, /* region 41 */
    0, 69, 69, -7755, 32767, 0, 0, 86, 36, /* region 42 */
    0, 70, 70, -6855, 21900, 0, 0, 86, 37, /* region 43 */
    769, 71, 71, -6355, 23197, 0, 1226, 35, 38, /* region 44 */
    769, 72, 72, -6955, 26028, 0, 1226, 35, 38, /* region 45 */
    1024, 73, 73, -7955, 32767, 0, 0, 22, 39, /* region 46 */
    1024, 74, 74, -8455, 32767, 0, 0, 22, 40, /* region 47 */
    1, 75, 75, -7900, 23197, 0, 31, 139, 41, /* region 48 */
    0, 76, 76, -10455, 23197, 0, 0, 134, 42, /* region 49 */
    0, 77, 77, -10055, 23197, 0, 0, 134, 43, /* region 50 */
    0, 78, 78, -8853, 16422, 0, 0, 89, 44, /* region 51 */
    0, 79, 79, -10253, 16422, 0, 0, 89, 45, /* region 52 */
    1281, 80, 80, -6300, 13045, 209, 230, 103, 46, /* region 53 */
    1281, 81, 81, -6400, 16422, 209, 230, 103, 47, /* region 54 */
    0, 82, 82, -8455, 20675, 0, 0, 87, 48, /* region 55 */
    0, 83, 83, -8900, 32767, 0, 0, 13, 49, /* region 56 */
    1, 84, 84, -8400, 23197, 0, 10294, 5, 50, /* region 57 */
    0, 85, 85, -9655, 32767, 0, 0, 135, 4, /* region 58 */
    0, 86, 86, -9068, 16422, 0, 0, 24, 51, /* region 59 */
    32769, 87, 87, -9168, 32767, 1335, 1603, 24, 52, /* region 60 */
    1, 12, 67, -6605, 23197, 437, 16584, 2, 48, /* region 61 */
    1, 68, 73, -7196, 23197, 452, 16803, 0, 48, /* region 62 */
    32769, 74, 108, -8467, 23197, 404, 16698, 1, 48, /* region 63 */
    1, 12, 78, -6605, 16422, 437, 16584, 2, 48, /* region 64 */
    1, 79, 91, -7196, 16422, 452, 16803, 0, 48, /* region 65 */
    32769, 92, 108, -8467, 16422, 404, 16698, 1, 48, /* region 66 */
    1, 12, 78, -6605, 16422, 437, 16584, 2, 48, /* region 67 */
    1, 79, 91, -7196, 16422, 452, 16803, 0, 48, /* region 68 */
    32769, 92, 108, -8467, 16422, 404, 16698, 1, 48, /* region 69 */
    1, 12, 70, -6600, 23197, 437, 16584, 2, 48, /* region 70 */
    1, 71, 88, -7191, 23197, 452, 16803, 0, 48, /* region 71 */
    32769, 89, 108, -8462, 23197, 404, 16698, 1, 48, /* region 72 */
    1, 12, 54, -5956, 13045, 639, 4368, 10, 48, /* region 73 */
    32769, 55, 108, -6351, 18426, 702, 3112, 12, 48, /* region 74 */
    1, 12, 66, -6611, 23197, 437, 16584, 2, 48, /* region 75 */
    1, 67, 87, -7202, 23197, 452, 16803, 0, 48, /* region 76 */
    32769, 88, 108, -8473, 16422, 404, 16698, 1, 48, /* region 77 */
    1, 12, 43, -3055, 23197, 920, 1383, 30, 59, /* region 78 */
    32769, 44, 96, -5060, 18426, 885, 1176, 37, 59, /* region 79 */
    1, 12, 48, -3461, 18426, 1148, 1514, 26, 60, /* region 80 */
    32769, 49, 96, -6253, 16422, 1347, 1420, 29, 60, /* region 81 */
    1, 33, 56, -5600, 26028, 1064, 1170, 38, 61, /* region 82 */
    1, 57, 72, -6000, 26028, 930, 1014, 44, 61, /* region 83 */
    32769, 73, 108, -7600, 26028, 726, 826, 52, 61, /* region 84 */
    1, 36, 96, -7600, 20675, 635, 735, 58, 62, /* region 85 */
    32769, 97, 108, -10108, 13045, 0, 31, 139, 62, /* region 86 */
    1, 36, 96, -7600, 14636, 635, 735, 58, 0, /* region 87 */
    32769, 97, 108, -10108, 13045, 0, 31, 139, 0, /* region 88 */
    1, 36, 83, -6006, 13045, 838, 922, 47, 63, /* region 89 */
    1, 84, 93, -8406, 14636, 209, 230, 103, 63, /* region 90 */
    32769, 94, 108, -10108, 13045, 0, 31, 139, 63, /* region 91 */
    1, 36, 83, -6006, 13045, 838, 922, 47, 64, /* region 92 */
    1, 84, 93, -8406, 13045, 209, 230, 103, 64, /* region 93 */
    32769, 94, 108, -10108, 13045, 0, 31, 139, 64, /* region 94 */
    1, 21, 56, -5595, 23197, 1064, 1170, 38, 65, /* region 95 */
    1, 57, 72, -5995, 23197, 930, 1014, 44, 65, /* region 96 */
    32769, 73, 108, -7598, 23197, 726, 826, 52, 65, /* region 97 */
    1, 12, 83, -6006, 16422, 838, 922, 47, 66, /* region 98 */
    1, 84, 93, -8406, 16422, 209, 230, 103, 66, /* region 99 */
    32769, 94, 108, -10108, 16422, 0, 31, 139, 66, /* region 100 */
    1, 24, 83, -6006, 16422, 838, 922, 47, 67, /* region 101 */
    1, 84, 93, -8406, 16422, 209, 230, 103, 67, /* region 102 */
    32769, 94, 108, -10108, 16422, 0, 31, 139, 67, /* region 103 */
    1, 12, 83, -6020, 16422, 0, 83, 126, 68, /* region 104 */
    1, 84, 90, -8482, 16422, 0, 20, 145, 68, /* region 105 */
    32769, 91, 108, -9101, 16422, 6, 20, 147, 68, /* region 106 */
    1, 21, 75, -7241, 16422, 419, 460, 76, 69, /* region 107 */
    32769, 76, 108, -9690, 14636, 254, 264, 101, 69, /* region 108 */
    32769, 36, 84, -7755, 16422, 0, 2775, 17, 70, /* region 109 */
    32769, 12, 108, -6655, 23197, 30, 276, 100, 71, /* region 110 */
    0, 12, 60, -7914, 26028, 0, 0, 15, 72, /* region 111 */
    32768, 61, 96, -7914, 26028, 0, 0, 15, 73, /* region 112 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 74, /* region 113 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 74, /* region 114 */
    1, 12, 35, -5355, 16422, 2869, 3778, 11, 75, /* region 115 */
    1, 36, 48, -6555, 20675, 2869, 3778, 11, 75, /* region 116 */
    32769, 49, 72, -6555, 20675, 2869, 3778, 11, 76, /* region 117 */
    1, 16, 55, -6224, 20675, 1045, 1119, 41, 77, /* region 118 */
    32769, 56, 96, -6718, 20675, 907, 963, 46, 77, /* region 119 */
    1, 16, 53, -5994, 29204, 1140, 1479, 27, 78, /* region 120 */
    1, 54, 70, -7171, 29204, 726, 812, 55, 78, /* region 121 */
    32769, 71, 108, -7788, 29204, 718, 748, 56, 78, /* region 122 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 79, /* region 123 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 79, /* region 124 */
    1, 16, 54, -5727, 20675, 5362, 5461, 9, 80, /* region 125 */
    1, 55, 63, -5851, 26028, 1362, 1454, 28, 80, /* region 126 */
    32769, 64, 108, -6744, 16422, 311, 366, 88, 80, /* region 127 */
    1, 16, 48, -4798, 20675, 1132, 1301, 31, 81, /* region 128 */
    32769, 49, 108, -5988, 20675, 1099, 1184, 36, 81, /* region 129 */
    1, 21, 68, -8458, 20675, 87, 2170, 18, 82, /* region 130 */
    1, 69, 82, -8960, 20675, 120, 2167, 19, 82, /* region 131 */
    32769, 83, 108, -10160, 20675, 376, 2041, 20, 82, /* region 132 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 83, /* region 133 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 83, /* region 134 */
    32769, 55, 108, -7368, 20675, 0, 477, 75, 84, /* region 135 */
    32769, 36, 96, -6900, 14636, 101, 151, 116, 85, /* region 136 */
    1, 24, 83, -6020, 13045, 0, 83, 126, 86, /* region 137 */
    1, 84, 90, -8482, 13045, 0, 20, 145, 86, /* region 138 */
    32769, 91, 108, -9101, 13045, 6, 20, 147, 86, /* region 139 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 87, /* region 140 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 87, /* region 141 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 88, /* region 142 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 88, /* region 143 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 89, /* region 144 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 89, /* region 145 */
    1, 24, 83, -6020, 13045, 0, 83, 126, 90, /* region 146 */
    1, 84, 90, -8482, 13045, 0, 20, 145, 90, /* region 147 */
    32769, 91, 108, -9101, 13045, 6, 20, 147, 90, /* region 148 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 91, /* region 149 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 91, /* region 150 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 92, /* region 151 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 92, /* region 152 */
    1, 12, 62, -7053, 16422, 23, 10953, 4, 93, /* region 153 */
    32769, 63, 108, -7755, 20675, 11, 11753, 3, 93, /* region 154 */
    1, 12, 62, -7053, 16422, 23, 10953, 4, 94, /* region 155 */
    32769, 63, 108, -7755, 16422, 11, 11753, 3, 94, /* region 156 */
    1, 24, 79, -6020, 13045, 0, 83, 126, 95, /* region 157 */
    1, 80, 90, -8482, 13045, 0, 20, 145, 95, /* region 158 */
    32769, 91, 108, -9101, 13045, 6, 20, 147, 95, /* region 159 */
    1, 12, 65, -7053, 13045, 23, 10953, 4, 96, /* region 160 */
    32769, 66, 108, -7755, 16422, 11, 11753, 3, 96, /* region 161 */
    32768, 36, 84, -7500, 20675, 0, 0, 25, 97, /* region 162 */
    32769, 36, 96, -8855, 20675, 1482, 1613, 23, 98, /* region 163 */
    32769, 12, 96, -4366, 32767, 818, 1033, 42, 99, /* region 164 */
    32769, 36, 84, -8568, 18426, 0, 293, 98, 100, /* region 165 */
    32769, 12, 96, -6020, 26028, 0, 83, 125, 101, /* region 166 */
    32769, 12, 96, -6020, 20675, 0, 83, 125, 102, /* region 167 */
    1, 12, 83, -6020, 13045, 0, 83, 125, 104, /* region 168 */
    1, 84, 90, -8482, 13045, 0, 20, 146, 104, /* region 169 */
    32769, 91, 108, -9101, 13045, 6, 20, 148, 104, /* region 170 */
    32769, 36, 108, -8570, 32767, 472, 491, 74, 105, /* region 171 */
    32769, 36, 108, -8570, 20675, 472, 491, 74, 106, /* region 172 */
    1, 12, 72, -6012, 7336, 2, 86, 124, 107, /* region 173 */
    1, 73, 101, -8500, 8231, 2, 22, 143, 107, /* region 174 */
    32769, 102, 108, -9683, 20675, 173, 183, 110, 107, /* region 175 */
    1, 21, 96, -7768, 13045, 477, 507, 73, 108, /* region 176 */
    32769, 97, 108, -9683, 13045, 173, 183, 110, 109, /* region 177 */
    32769, 12, 108, -7771, 16422, 477, 507, 73, 110, /* region 178 */
    1, 12, 53, -4971, 16422, 388, 541, 68, 111, /* region 179 */
    32769, 54, 60, -5949, 11626, 473, 560, 65, 111, /* region 180 */
    32769, 36, 72, -5949, 16422, 473, 560, 65, 112, /* region 181 */
    1, 48, 58, -7053, 16422, 356, 402, 82, 113, /* region 182 */
    1, 59, 65, -7574, 16422, 514, 548, 67, 113, /* region 183 */
    1, 66, 78, -8174, 16422, 505, 529, 71, 113, /* region 184 */
    32769, 79, 96, -9233, 16422, 178, 191, 109, 113, /* region 185 */
    1, 55, 60, -7053, 16422, 356, 402, 82, 114, /* region 186 */
    1, 61, 69, -7574, 16422, 514, 548, 67, 114, /* region 187 */
    1, 70, 79, -8174, 16422, 505, 529, 71, 114, /* region 188 */
    32769, 80, 108, -9233, 16422, 178, 191, 109, 114, /* region 189 */
    1, 16, 82, -8029, 23197, 180, 206, 106, 115, /* region 190 */
    32769, 83, 108, -7240, 18426, 3, 44, 131, 115, /* region 191 */
    32769, 21, 108, -8869, 20675, 483, 515, 72, 116, /* region 192 */
    1, 21, 89, -7205, 18426, 3, 45, 130, 117, /* region 193 */
    32769, 90, 108, -9101, 10362, 6, 20, 148, 117, /* region 194 */
    1, 21, 42, -4686, 20675, 0, 180, 111, 118, /* region 195 */
    1, 43, 51, -5286, 23197, 0, 127, 120, 118, /* region 196 */
    1, 52, 58, -6292, 26028, 0, 71, 127, 118, /* region 197 */
    1, 59, 68, -7468, 23197, 0, 36, 136, 118, /* region 198 */
    32769, 69, 108, -8574, 20675, 0, 19, 149, 118, /* region 199 */
    1, 21, 89, -7199, 20675, 3, 45, 130, 119, /* region 200 */
    32769, 90, 108, -9101, 14636, 6, 20, 148, 119, /* region 201 */
    1, 21, 46, -5651, 26028, 236, 340, 92, 120, /* region 202 */
    1, 47, 71, -6563, 20675, 824, 885, 49, 120, /* region 203 */
    1, 72, 88, -7907, 18426, 719, 747, 57, 120, /* region 204 */
    1, 89, 93, -8876, 16422, 83, 99, 122, 120, /* region 205 */
    32769, 94, 108, -9689, 16422, 173, 183, 110, 120, /* region 206 */
    1, 60, 71, -7205, 16422, 0, 42, 132, 121, /* region 207 */
    1, 72, 78, -7903, 16422, 0, 28, 141, 121, /* region 208 */
    32769, 79, 96, -8405, 16422, 0, 21, 144, 121, /* region 209 */
    1, 48, 65, -6316, 11626, 0, 70, 128, 122, /* region 210 */
    1, 66, 79, -7724, 14636, 0, 31, 138, 122, /* region 211 */
    32769, 80, 96, -8030, 11626, 0, 26, 142, 122, /* region 212 */
    1, 16, 44, -5868, 14636, 163, 254, 102, 123, /* region 213 */
    1, 45, 51, -6418, 16422, 261, 393, 85, 123, /* region 214 */
    1, 52, 58, -7333, 18426, 190, 229, 104, 123, /* region 215 */
    1, 59, 66, -8100, 18426, 168, 193, 108, 123, /* region 216 */
    1, 67, 70, -8576, 18426, 138, 157, 115, 123, /* region 217 */
    1, 71, 80, -9103, 18426, 166, 180, 112, 123, /* region 218 */
    32769, 81, 108, -10074, 18426, 135, 151, 117, 123, /* region 219 */
    32769, 12, 96, -5004, 23197, 570, 719, 59, 124, /* region 220 */
    1, 12, 48, -5868, 14636, 163, 254, 102, 125, /* region 221 */
    1, 49, 54, -6418, 16422, 261, 393, 85, 125, /* region 222 */
    1, 55, 63, -7333, 18426, 190, 229, 104, 125, /* region 223 */
    1, 64, 70, -8100, 18426, 168, 193, 108, 125, /* region 224 */
    1, 71, 75, -8576, 18426, 138, 157, 115, 125, /* region 225 */
    1, 76, 82, -9103, 18426, 166, 180, 112, 125, /* region 226 */
    32769, 83, 108, -10074, 18426, 135, 151, 117, 125, /* region 227 */
    32770, 36, 84, -7200, 29204, 0, 0, 0, 126, /* region 228 */
    32770, 36, 84, -7600, 8231, 0, 0, 0, 127, /* region 229 */
    32770, 36, 84, -7200, 20675, 0, 0, 0, 128, /* region 230 */
    32769, 36, 84, -6000, -24285, 1294, 5778, 8, 129, /* region 231 */
    32769, 36, 84, -6555, 29204, 798, 993, 45, 130, /* region 232 */
    32769, 36, 84, -6855, 20675, 798, 993, 45, 131, /* region 233 */
    32769, 36, 84, -7755, 29204, 798, 993, 45, 132, /* region 234 */
    32768, 36, 84, -8155, 32767, 0, 0, 133, 133, /* region 235 */
    32768, 36, 84, -6555, 20675, 0, 0, 91, 134, /* region 236 */
    1, 24, 62, -7000, 23197, 286, 333, 94, 135, /* region 237 */
    1, 63, 66, -7364, 26028, 297, 335, 93, 135, /* region 238 */
    1, 67, 72, -7722, 23197, 368, 399, 84, 135, /* region 239 */
    32769, 73, 96, -8310, 23197, 116, 138, 119, 135, /* region 240 */
    1, 24, 48, -5141, 23197, 309, 447, 77, 136, /* region 241 */
    1, 49, 56, -6266, 26028, 211, 283, 99, 136, /* region 242 */
    1, 57, 63, -7000, 26028, 286, 333, 94, 136, /* region 243 */
    32769, 64, 84, -7722, 23197, 368, 399, 84, 136, /* region 244 */
    1, 24, 56, -6266, 29204, 211, 283, 99, 137, /* region 245 */
    1, 57, 63, -7000, 29204, 286, 333, 94, 137, /* region 246 */
    1, 64, 69, -7722, 29204, 368, 399, 84, 137, /* region 247 */
    32769, 70, 96, -8310, 29204, 116, 138, 119, 137, /* region 248 */
    1, 24, 68, -7722, 18426, 368, 399, 84, 138, /* region 249 */
    1, 69, 76, -8310, 26028, 116, 138, 119, 138, /* region 250 */
    32769, 77, 108, -8758, 23197, 127, 144, 118, 138, /* region 251 */
    1, 24, 82, -7613, 23197, 389, 422, 80, 139, /* region 252 */
    32769, 83, 108, -8764, 26028, 146, 163, 114, 139, /* region 253 */
    1, 12, 58, -6898, 29204, 386, 436, 78, 140, /* region 254 */
    32769, 59, 96, -7371, 26028, 290, 328, 95, 140, /* region 255 */
    1, 12, 58, -6898, 16422, 386, 436, 78, 141, /* region 256 */
    32769, 59, 96, -7371, 18426, 290, 328, 95, 141, /* region 257 */
    1, 12, 48, -6898, -28771, 386, 436, 78, 142, /* region 258 */
    32769, 49, 84, -7371, 29204, 290, 328, 95, 142, /* region 259 */
    1, 12, 60, -5453, 20675, 314, 430, 79, 143, /* region 260 */
    32769, 61, 84, -6553, 18426, 263, 324, 96, 143, /* region 261 */
    1, 24, 60, -6553, 16422, 263, 324, 96, 144, /* region 262 */
    1, 61, 70, -7669, 20675, 279, 311, 97, 144, /* region 263 */
    32769, 71, 96, -8098, 23197, 179, 204, 107, 144, /* region 264 */
    1, 24, 84, -8483, 20675, 191, 211, 105, 145, /* region 265 */
    32769, 85, 108, -9683, 20675, 92, 102, 121, 145, /* region 266 */
    1, 21, 69, -6553, 13045, 263, 324, 96, 146, /* region 267 */
    1, 70, 94, -7669, 20675, 279, 311, 97, 146, /* region 268 */
    1, 95, 96, -8098, -24285, 179, 204, 107, 146, /* region 269 */
    32769, 97, 108, -9683, -24285, 173, 183, 110, 146, /* region 270 */
    1, 16, 55, -8100, 20675, 168, 193, 108, 147, /* region 271 */
    1, 56, 74, -8576, 26028, 138, 157, 115, 147, /* region 272 */
    32769, 75, 96, -10074, 26028, 135, 151, 117, 147, /* region 273 */
    1, 24, 72, -8098, 26028, 179, 204, 107, 148, /* region 274 */
    1, 73, 85, -8483, 20675, 191, 211, 105, 148, /* region 275 */
    32769, 86, 108, -9683, 18426, 92, 102, 121, 148, /* region 276 */
    32769, 36, 108, -7730, 18426, 1839, 1901, 21, 149, /* region 277 */
    32769, 24, 108, -7273, 20675, 494, 534, 69, 150, /* region 278 */
    32769, 12, 108, -7273, 20675, 494, 534, 69, 151, /* region 279 */
    32769, 24, 108, -7273, 20675, 494, 534, 69, 152, /* region 280 */
    1, 36, 60, -4900, 5193, 2, 22, 143, 153, /* region 281 */
    32769, 61, 84, -6083, 20675, 173, 183, 110, 153, /* region 282 */
    32769, 24, 96, -6553, 14636, 263, 324, 96, 154, /* region 283 */
    32769, 36, 96, -7730, 26028, 1839, 1901, 21, 155, /* region 284 */
    32769, 24, 108, -7273, 20675, 494, 534, 69, 156, /* region 285 */
    1, 24, 58, -7851, 14636, 0, 29, 140, 157, /* region 286 */
    32769, 59, 96, -7851, 14636, 0, 29, 140, 157, /* region 287 */
    1, 12, 83, -6020, 13045, 0, 83, 125, 158, /* region 288 */
    1, 84, 90, -8482, 13045, 0, 20, 146, 158, /* region 289 */
    32769, 91, 108, -9101, 13045, 6, 20, 148, 158, /* region 290 */
    1, 21, 42, -4663, 26028, 1047, 1229, 34, 159, /* region 291 */
    1, 43, 48, -5456, 29204, 1138, 1253, 33, 159, /* region 292 */
    1, 49, 53, -5845, 26028, 559, 651, 60, 159, /* region 293 */
    1, 54, 60, -6732, 26028, 508, 563, 64, 159, /* region 294 */
    1, 61, 65, -7080, 32767, 819, 864, 51, 159, /* region 295 */
    1, 66, 70, -6866, 26942, 981, 1032, 43, 159, /* region 296 */
    1, 71, 76, -8166, 26028, 790, 814, 54, 159, /* region 297 */
    1, 77, 82, -8766, 26028, 592, 609, 61, 159, /* region 298 */
    1, 83, 87, -9517, 23197, 543, 554, 66, 159, /* region 299 */
    1, 88, 96, -10071, 18426, 601, 609, 62, 159, /* region 300 */
    32769, 97, 108, -10566, 18426, 523, 529, 70, 159, /* region 301 */
    1, 48, 69, -6313, 14636, 0, 70, 128, 160, /* region 302 */
    1, 70, 79, -7724, 18426, 0, 31, 138, 160, /* region 303 */
    32769, 80, 96, -8030, 14636, 0, 26, 142, 160, /* region 304 */
    1, 36, 72, -7134, 29204, 0, 87, 123, 161, /* region 305 */
    32769, 73, 96, -7960, 29204, 0, 54, 129, 161, /* region 306 */
    32769, 36, 96, -7730, 26028, 1839, 1901, 21, 162, /* region 307 */
    32769, 12, 96, -4372, 32767, 818, 1033, 42, 163, /* region 308 */
    32769, 36, 108, -8570, 26028, 472, 491, 74, 164, /* region 309 */
    32769, 12, 96, -5004, 29204, 570, 719, 59, 165, /* region 310 */
    1, 12, 83, -6020, 13045, 0, 83, 125, 166, /* region 311 */
    1, 84, 90, -8482, 13045, 0, 20, 146, 166, /* region 312 */
    32769, 91, 108, -9101, 13045, 6, 20, 148, 166, /* region 313 */
    1, 21, 46, -5651, 32767, 236, 340, 92, 167, /* region 314 */
    1, 47, 75, -6563, 26028, 824, 885, 49, 167, /* region 315 */
    1, 76, 84, -7907, 23197, 719, 747, 57, 167, /* region 316 */
    1, 85, 93, -8876, 20675, 83, 99, 122, 167, /* region 317 */
    32769, 94, 108, -9689, 20675, 173, 183, 110, 167, /* region 318 */
    1, 21, 46, -5651, 26028, 236, 340, 92, 168, /* region 319 */
    1, 47, 71, -6563, 20675, 824, 885, 49, 168, /* region 320 */
    1, 72, 88, -7907, 18426, 719, 747, 57, 168, /* region 321 */
    1, 89, 93, -8876, 16422, 83, 99, 122, 168, /* region 322 */
    32769, 94, 108, -9689, 16422, 173, 183, 110, 168, /* region 323 */
    1, 21, 45, -4663, 26028, 1047, 1229, 34, 169, /* region 324 */
    1, 46, 51, -5456, 29204, 1138, 1253, 33, 169, /* region 325 */
    1, 52, 54, -5845, 26028, 559, 651, 60, 169, /* region 326 */
    1, 55, 63, -6732, 26028, 508, 563, 64, 169, /* region 327 */
    1, 64, 68, -7080, 32767, 819, 864, 51, 169, /* region 328 */
    1, 69, 73, -6866, 26942, 981, 1032, 43, 169, /* region 329 */
    1, 74, 79, -8166, 26028, 790, 814, 54, 169, /* region 330 */
    1, 80, 88, -8766, 23197, 592, 609, 61, 169, /* region 331 */
    1, 89, 99, -10071, 18426, 601, 609, 62, 169, /* region 332 */
    32769, 100, 108, -10566, 18426, 523, 529, 70, 169, /* region 333 */
    1, 21, 45, -4663, 26028, 1047, 1229, 34, 170, /* region 334 */
    1, 46, 51, -5456, 29204, 1138, 1253, 33, 170, /* region 335 */
    1, 52, 54, -5845, 26028, 559, 651, 60, 170, /* region 336 */
    1, 55, 63, -6732, 26028, 508, 563, 64, 170, /* region 337 */
    1, 64, 68, -7080, 32767, 819, 864, 51, 170, /* region 338 */
    1, 69, 73, -6866, 26942, 981, 1032, 43, 170, /* region 339 */
    1, 74, 79, -8166, 26028, 790, 814, 54, 170, /* region 340 */
    1, 80, 88, -8766, 23197, 592, 609, 61, 170, /* region 341 */
    1, 89, 99, -10071, 18426, 601, 609, 62, 171, /* region 342 */
    32769, 100, 108, -10566, 18426, 523, 529, 70, 172, /* region 343 */
    32769, 36, 108, -8570, 20675, 472, 491, 74, 173, /* region 344 */
    32769, 12, 108, -7730, 20675, 1839, 1901, 21, 174, /* region 345 */
    1, 12, 44, -5868, 18426, 163, 254, 102, 175, /* region 346 */
    1, 45, 51, -6418, 20675, 261, 393, 85, 175, /* region 347 */
    1, 52, 58, -7333, 23197, 190, 229, 104, 175, /* region 348 */
    1, 59, 66, -8100, 23197, 168, 193, 108, 175, /* region 349 */
    1, 67, 70, -8576, 23197, 138, 157, 115, 175, /* region 350 */
    1, 71, 80, -9103, 23197, 166, 180, 112, 175, /* region 351 */
    32769, 81, 108, -10074, 23197, 135, 151, 117, 175, /* region 352 */
    1, 12, 65, -7053, 16422, 23, 10953, 4, 176, /* region 353 */
    32769, 66, 108, -7755, 20675, 11, 11753, 3, 176, /* region 354 */
    1, 12, 48, -4798, 29204, 1132, 1301, 31, 177, /* region 355 */
    32769, 49, 108, -5988, 29204, 1099, 1184, 36, 177, /* region 356 */
    1, 12, 83, -7241, 20675, 419, 460, 76, 178, /* region 357 */
    32769, 84, 108, -10123, 20675, 0, 31, 139, 178, /* region 358 */
    1, 55, 60, -7053, 18426, 356, 402, 82, 179, /* region 359 */
    1, 61, 69, -7574, 18426, 514, 548, 67, 179, /* region 360 */
    1, 70, 79, -8174, 18426, 505, 529, 71, 179, /* region 361 */
    32769, 80, 108, -9233, 23197, 178, 191, 109, 179, /* region 362 */
    32769, 36, 96, -7730, -24285, 1839, 1901, 21, 180, /* region 363 */
    1, 12, 83, -6006, 16422, 838, 922, 47, 181, /* region 364 */
    1, 84, 93, -8406, 18426, 209, 230, 103, 181, /* region 365 */
    32769, 94, 108, -10108, 16422, 0, 31, 139, 181, /* region 366 */
    1, 12, 56, -5595, 23197, 1064, 1170, 38, 182, /* region 367 */
    1, 57, 72, -5995, 23197, 930, 1014, 44, 182, /* region 368 */
    32769, 73, 108, -7598, 23197, 726, 826, 52, 182, /* region 369 */
    32769, 24, 108, -7600, 23197, 635, 735, 58, 62, /* region 370 */
    1, 36, 83, -6006, 13045, 838, 922, 47, 183, /* region 371 */
    1, 84, 93, -8406, 13045, 209, 230, 103, 183, /* region 372 */
    32769, 94, 108, -10108, 13045, 0, 31, 139, 183, /* region 373 */
    1, 12, 66, -6611, 23197, 437, 16584, 2, 184, /* region 374 */
    1, 67, 87, -7202, 23197, 452, 16803, 0, 184, /* region 375 */
    32769, 88, 108, -8473, 16422, 404, 16698, 1, 184 /* region 376 */
  }; /* end Regions */

  private static final short[] EAS_ARTICULATIONS = {
    /* articulation 0 */
    32767,
    30725,
    0,
    30725,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 1 */
    32767,
    26863,
    0,
    26863,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 2 */
    32767,
    30484,
    0,
    30668,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 3 */
    32767,
    26439,
    0,
    26439,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 4 */
    32767,
    0,
    32767,
    32715,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 5 */
    32767,
    21333,
    0,
    21333,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 6 */
    32767,
    31882,
    0,
    31938,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 7 */
    32767,
    32663,
    32767,
    32663,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 8 */
    32767,
    0,
    32767,
    0,
    32767,
    1902,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 9 */
    32767,
    32349,
    0,
    32349,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 10 */
    32767,
    0,
    32767,
    17213,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -1,
    /* articulation 11 */
    32767,
    31730,
    0,
    31730,
    32767,
    761,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -44,
    /* articulation 12 */
    32767,
    23749,
    0,
    23749,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    56,
    /* articulation 13 */
    32767,
    31730,
    0,
    31730,
    32767,
    761,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -31,
    /* articulation 14 */
    9511,
    21333,
    0,
    21333,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    56,
    /* articulation 15 */
    32767,
    31617,
    0,
    31617,
    32767,
    761,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -6,
    /* articulation 16 */
    32767,
    32123,
    0,
    32194,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    56,
    /* articulation 17 */
    32767,
    31550,
    0,
    31550,
    32767,
    761,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    6,
    /* articulation 18 */
    32767,
    31391,
    0,
    31391,
    32767,
    951,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    31,
    /* articulation 19 */
    32767,
    31964,
    0,
    31964,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    25,
    /* articulation 20 */
    32767,
    31056,
    0,
    31056,
    32767,
    951,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    63,
    /* articulation 21 */
    32767,
    32289,
    0,
    32271,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -37,
    /* articulation 22 */
    19021,
    31882,
    0,
    31911,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -37,
    /* articulation 23 */
    32767,
    31988,
    0,
    32032,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -37,
    /* articulation 24 */
    32767,
    0,
    32767,
    32663,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    12,
    /* articulation 25 */
    32767,
    31352,
    0,
    31352,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -25,
    /* articulation 26 */
    32767,
    0,
    32767,
    32663,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    25,
    /* articulation 27 */
    32767,
    31817,
    0,
    31781,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -25,
    /* articulation 28 */
    32767,
    30725,
    0,
    30725,
    32767,
    95,
    0,
    0,
    0,
    0,
    951,
    240,
    0,
    0,
    0,
    0,
    -56,
    /* articulation 29 */
    32767,
    32230,
    0,
    32218,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -37,
    /* articulation 30 */
    32767,
    26439,
    0,
    26439,
    32767,
    3804,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    50,
    /* articulation 31 */
    32767,
    23749,
    0,
    23749,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -50,
    /* articulation 32 */
    32767,
    29434,
    0,
    29434,
    32767,
    3804,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -50,
    /* articulation 33 */
    32767,
    30240,
    0,
    30234,
    32767,
    3804,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -44,
    /* articulation 34 */
    32767,
    32558,
    0,
    32558,
    32767,
    254,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    25,
    /* articulation 35 */
    32767,
    0,
    32767,
    32663,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -63,
    /* articulation 36 */
    3804,
    23749,
    0,
    23749,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -63,
    /* articulation 37 */
    32767,
    23749,
    0,
    23749,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -59,
    /* articulation 38 */
    32767,
    30725,
    0,
    30725,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    50,
    /* articulation 39 */
    32767,
    28809,
    0,
    28809,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    44,
    /* articulation 40 */
    1902,
    30725,
    0,
    30725,
    32767,
    380,
    0,
    0,
    0,
    0,
    951,
    -100,
    0,
    0,
    0,
    0,
    44,
    /* articulation 41 */
    32767,
    9042,
    0,
    9042,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    25,
    /* articulation 42 */
    32767,
    29889,
    0,
    29889,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    63,
    /* articulation 43 */
    32767,
    30240,
    0,
    30234,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    63,
    /* articulation 44 */
    19021,
    19970,
    0,
    19970,
    951,
    32767,
    32767,
    0,
    0,
    0,
    951,
    100,
    0,
    0,
    0,
    0,
    -25,
    /* articulation 45 */
    3804,
    17213,
    0,
    17213,
    951,
    32767,
    32767,
    0,
    0,
    0,
    951,
    500,
    0,
    0,
    0,
    0,
    -25,
    /* articulation 46 */
    32767,
    17213,
    0,
    17213,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -56,
    /* articulation 47 */
    32767,
    30725,
    0,
    30725,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    -56,
    /* articulation 48 */
    32767,
    0,
    32767,
    0,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 49 */
    32767,
    31180,
    0,
    31180,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 50 */
    19021,
    31964,
    0,
    32071,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 51 */
    32767,
    29669,
    0,
    29669,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 52 */
    32767,
    31742,
    0,
    31352,
    32767,
    294,
    0,
    0,
    0,
    0,
    951,
    0,
    10000,
    7121,
    0,
    0,
    0,
    /* articulation 53 */
    32767,
    0,
    32767,
    31391,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    1555,
    0,
    -2300,
    11920,
    0,
    0,
    0,
    /* articulation 54 */
    1174,
    0,
    32767,
    31988,
    32767,
    127,
    0,
    0,
    0,
    0,
    1555,
    0,
    2000,
    10721,
    0,
    8,
    15,
    /* articulation 55 */
    1174,
    0,
    32767,
    31988,
    951,
    127,
    0,
    0,
    0,
    0,
    1555,
    0,
    2000,
    9023,
    0,
    5,
    15,
    /* articulation 56 */
    7608,
    0,
    32767,
    30237,
    32767,
    69,
    5898,
    0,
    0,
    0,
    1555,
    0,
    6000,
    9080,
    0,
    0,
    -2,
    /* articulation 57 */
    32767,
    0,
    32767,
    29337,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    1555,
    0,
    0,
    0,
    0,
    0,
    1,
    /* articulation 58 */
    5141,
    0,
    32767,
    30194,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    1555,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 59 */
    32767,
    32558,
    0,
    26439,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 60 */
    32767,
    32349,
    0,
    26439,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 61 */
    32767,
    32072,
    0,
    32072,
    32767,
    95,
    0,
    0,
    0,
    34,
    989,
    0,
    2400,
    9521,
    0,
    0,
    0,
    /* articulation 62 */
    32767,
    30234,
    0,
    30234,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    11738,
    0,
    16,
    0,
    /* articulation 63 */
    32767,
    32349,
    0,
    30073,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 64 */
    32767,
    31730,
    0,
    31476,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 65 */
    32767,
    32418,
    0,
    25329,
    32767,
    95,
    0,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 66 */
    32767,
    32052,
    0,
    31964,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 67 */
    32767,
    31938,
    0,
    31938,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 68 */
    9511,
    32663,
    18820,
    23749,
    1902,
    57,
    13107,
    0,
    0,
    0,
    989,
    0,
    6000,
    5535,
    0,
    4,
    0,
    /* articulation 69 */
    32767,
    31754,
    0,
    31730,
    32767,
    1902,
    0,
    0,
    0,
    52,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 70 */
    127,
    32686,
    3811,
    32349,
    95,
    38,
    32767,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 71 */
    4755,
    32663,
    3566,
    28809,
    3804,
    32767,
    32767,
    0,
    0,
    0,
    989,
    100,
    0,
    11919,
    0,
    0,
    0,
    /* articulation 72 */
    32767,
    31935,
    0,
    31935,
    32767,
    335,
    0,
    0,
    0,
    17,
    989,
    0,
    7000,
    9023,
    0,
    0,
    0,
    /* articulation 73 */
    32767,
    31391,
    0,
    31391,
    32767,
    335,
    0,
    0,
    0,
    2,
    951,
    0,
    7000,
    9023,
    0,
    0,
    0,
    /* articulation 74 */
    32767,
    32628,
    6208,
    31935,
    380,
    95,
    0,
    0,
    0,
    0,
    989,
    0,
    3840,
    8302,
    0,
    8,
    0,
    /* articulation 75 */
    32767,
    32072,
    0,
    32171,
    32767,
    380,
    0,
    0,
    0,
    0,
    989,
    0,
    5000,
    8321,
    0,
    0,
    0,
    /* articulation 76 */
    32767,
    31935,
    0,
    31935,
    32767,
    380,
    0,
    0,
    0,
    0,
    951,
    0,
    5000,
    7934,
    0,
    0,
    0,
    /* articulation 77 */
    32767,
    32117,
    0,
    30685,
    32767,
    63,
    0,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 78 */
    32767,
    32245,
    0,
    23749,
    32767,
    1902,
    0,
    0,
    0,
    172,
    989,
    0,
    1000,
    11107,
    0,
    0,
    0,
    /* articulation 79 */
    32767,
    32663,
    6208,
    31935,
    95,
    95,
    0,
    0,
    0,
    34,
    1622,
    0,
    3560,
    8834,
    1,
    8,
    0,
    /* articulation 80 */
    32767,
    32362,
    0,
    26439,
    32767,
    190,
    0,
    0,
    0,
    17,
    989,
    0,
    6000,
    9907,
    0,
    0,
    0,
    /* articulation 81 */
    32767,
    32245,
    0,
    23749,
    32767,
    63,
    0,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 82 */
    32767,
    31730,
    18820,
    9042,
    32767,
    32767,
    32767,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 83 */
    32767,
    32715,
    128,
    32168,
    32767,
    127,
    0,
    0,
    0,
    0,
    989,
    0,
    0,
    11920,
    0,
    8,
    0,
    /* articulation 84 */
    32767,
    32072,
    0,
    32072,
    32767,
    67,
    0,
    0,
    3,
    0,
    572,
    0,
    5000,
    5535,
    0,
    0,
    0,
    /* articulation 85 */
    3804,
    32663,
    18820,
    23749,
    32767,
    2024,
    0,
    0,
    10,
    34,
    1008,
    -30,
    0,
    0,
    0,
    0,
    0,
    /* articulation 86 */
    19021,
    32663,
    18820,
    23749,
    761,
    95,
    0,
    0,
    0,
    34,
    989,
    0,
    4473,
    7131,
    0,
    8,
    0,
    /* articulation 87 */
    1902,
    32628,
    6208,
    32171,
    634,
    38,
    16384,
    0,
    0,
    0,
    989,
    0,
    2987,
    7877,
    0,
    12,
    0,
    /* articulation 88 */
    32767,
    32593,
    0,
    31935,
    32767,
    95,
    0,
    0,
    0,
    0,
    1162,
    0,
    4053,
    7930,
    2,
    12,
    0,
    /* articulation 89 */
    380,
    32684,
    6208,
    31935,
    32767,
    112,
    0,
    0,
    0,
    0,
    989,
    0,
    0,
    8887,
    0,
    0,
    0,
    /* articulation 90 */
    19021,
    32663,
    18820,
    23749,
    1268,
    95,
    0,
    0,
    0,
    34,
    989,
    0,
    5113,
    7981,
    0,
    4,
    0,
    /* articulation 91 */
    1902,
    32663,
    6208,
    30725,
    1902,
    127,
    0,
    0,
    0,
    34,
    989,
    0,
    3500,
    7877,
    0,
    5,
    0,
    /* articulation 92 */
    1902,
    32663,
    6208,
    30725,
    1268,
    95,
    0,
    0,
    0,
    34,
    951,
    0,
    4773,
    8355,
    0,
    5,
    0,
    /* articulation 93 */
    476,
    32663,
    10809,
    31935,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 94 */
    3804,
    32663,
    18820,
    30234,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 95 */
    7608,
    32663,
    18820,
    17213,
    2536,
    261,
    0,
    0,
    0,
    34,
    989,
    0,
    1200,
    11690,
    0,
    4,
    0,
    /* articulation 96 */
    32767,
    32468,
    15076,
    30234,
    32767,
    32767,
    32767,
    0,
    0,
    36,
    2183,
    0,
    0,
    11919,
    1,
    0,
    0,
    /* articulation 97 */
    32767,
    0,
    32767,
    32663,
    380,
    32767,
    32767,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 98 */
    32767,
    31391,
    0,
    31391,
    32767,
    634,
    0,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 99 */
    32767,
    32558,
    0,
    23749,
    1268,
    190,
    13107,
    0,
    0,
    34,
    989,
    0,
    3200,
    8321,
    0,
    0,
    0,
    /* articulation 100 */
    32767,
    0,
    32767,
    0,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 101 */
    32767,
    32072,
    0,
    23749,
    32767,
    1087,
    0,
    0,
    0,
    34,
    989,
    0,
    8187,
    5535,
    0,
    5,
    0,
    /* articulation 102 */
    32767,
    32558,
    0,
    29434,
    32767,
    190,
    7667,
    0,
    5,
    0,
    989,
    0,
    6053,
    5535,
    0,
    5,
    0,
    /* articulation 103 */
    32767,
    32663,
    18820,
    23749,
    1902,
    95,
    0,
    0,
    0,
    0,
    989,
    0,
    2700,
    9852,
    0,
    0,
    0,
    /* articulation 104 */
    32767,
    32663,
    18820,
    27897,
    1902,
    95,
    0,
    0,
    0,
    0,
    989,
    0,
    2700,
    9852,
    0,
    0,
    0,
    /* articulation 105 */
    32767,
    32663,
    18820,
    23749,
    32767,
    1268,
    0,
    0,
    0,
    52,
    951,
    0,
    2500,
    10490,
    1,
    8,
    0,
    /* articulation 106 */
    32767,
    32663,
    23493,
    23749,
    32767,
    380,
    0,
    0,
    0,
    34,
    988,
    0,
    4000,
    10223,
    1,
    4,
    0,
    /* articulation 107 */
    32767,
    32663,
    18820,
    27897,
    32767,
    126,
    7667,
    0,
    0,
    0,
    989,
    0,
    1813,
    9154,
    0,
    0,
    0,
    /* articulation 108 */
    32767,
    31730,
    0,
    31730,
    32767,
    380,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 109 */
    32767,
    31180,
    0,
    30484,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    11690,
    0,
    0,
    0,
    /* articulation 110 */
    32767,
    30725,
    0,
    30725,
    32767,
    380,
    0,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 111 */
    32767,
    32349,
    18820,
    27897,
    32767,
    95,
    0,
    0,
    12,
    34,
    951,
    0,
    3000,
    10223,
    0,
    0,
    0,
    /* articulation 112 */
    32767,
    32349,
    18820,
    27897,
    32767,
    63,
    0,
    0,
    12,
    34,
    951,
    0,
    1900,
    10031,
    0,
    0,
    0,
    /* articulation 113 */
    32767,
    32663,
    18820,
    26439,
    32767,
    63,
    0,
    0,
    12,
    34,
    988,
    0,
    1000,
    11107,
    0,
    0,
    0,
    /* articulation 114 */
    32767,
    32663,
    18820,
    26439,
    32767,
    63,
    0,
    0,
    12,
    34,
    988,
    0,
    2000,
    11107,
    0,
    0,
    0,
    /* articulation 115 */
    32767,
    32505,
    0,
    26439,
    32767,
    190,
    0,
    0,
    0,
    17,
    989,
    0,
    4000,
    8321,
    0,
    0,
    0,
    /* articulation 116 */
    32767,
    31832,
    19893,
    9042,
    32767,
    476,
    0,
    0,
    0,
    34,
    1452,
    0,
    0,
    11919,
    0,
    0,
    0,
    /* articulation 117 */
    19021,
    32072,
    23493,
    9042,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    1355,
    0,
    0,
    11877,
    1,
    0,
    0,
    /* articulation 118 */
    32767,
    32468,
    0,
    23749,
    32767,
    190,
    0,
    0,
    0,
    34,
    989,
    0,
    3500,
    9023,
    0,
    0,
    0,
    /* articulation 119 */
    32767,
    17213,
    23493,
    0,
    32767,
    32767,
    32767,
    0,
    0,
    17,
    1521,
    0,
    0,
    10925,
    1,
    0,
    0,
    /* articulation 120 */
    32767,
    32505,
    0,
    26439,
    32767,
    190,
    0,
    0,
    0,
    52,
    989,
    0,
    3200,
    8721,
    0,
    4,
    0,
    /* articulation 121 */
    3804,
    32663,
    18820,
    23749,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    1,
    0,
    0,
    /* articulation 122 */
    9511,
    32663,
    18820,
    25329,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    989,
    0,
    0,
    11877,
    0,
    8,
    0,
    /* articulation 123 */
    32767,
    32663,
    18820,
    23749,
    32767,
    32,
    0,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 124 */
    32767,
    32558,
    0,
    23749,
    32767,
    380,
    0,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 125 */
    32767,
    32663,
    18820,
    23749,
    32767,
    24,
    0,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 126 */
    32767,
    30725,
    0,
    30725,
    32767,
    761,
    0,
    0,
    0,
    0,
    989,
    0,
    3000,
    10223,
    0,
    8,
    0,
    /* articulation 127 */
    127,
    0,
    32767,
    32349,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    1522,
    0,
    0,
    11423,
    4,
    0,
    0,
    /* articulation 128 */
    951,
    32422,
    0,
    32387,
    32767,
    19,
    0,
    0,
    0,
    0,
    989,
    0,
    0,
    11423,
    0,
    0,
    0,
    /* articulation 129 */
    391,
    0,
    0,
    31180,
    190,
    32767,
    32767,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 130 */
    32767,
    30725,
    0,
    30725,
    32767,
    761,
    0,
    0,
    0,
    0,
    989,
    1200,
    0,
    0,
    0,
    0,
    0,
    /* articulation 131 */
    32767,
    31730,
    0,
    31935,
    32767,
    380,
    0,
    0,
    0,
    0,
    989,
    50,
    0,
    0,
    0,
    0,
    0,
    /* articulation 132 */
    32767,
    32072,
    0,
    32072,
    32767,
    19021,
    0,
    0,
    0,
    0,
    989,
    0,
    4700,
    7769,
    0,
    0,
    0,
    /* articulation 133 */
    32767,
    30073,
    0,
    30073,
    32767,
    32767,
    0,
    0,
    0,
    0,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 134 */
    32767,
    32558,
    32767,
    32558,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 135 */
    32767,
    32663,
    18820,
    17213,
    32767,
    190,
    0,
    0,
    10,
    34,
    951,
    0,
    2000,
    10696,
    0,
    0,
    0,
    /* articulation 136 */
    32767,
    32663,
    10809,
    17213,
    32767,
    190,
    0,
    0,
    12,
    34,
    982,
    0,
    0,
    10910,
    0,
    0,
    0,
    /* articulation 137 */
    32767,
    32663,
    18820,
    17213,
    32767,
    190,
    0,
    0,
    10,
    34,
    951,
    0,
    1200,
    10218,
    0,
    0,
    0,
    /* articulation 138 */
    32767,
    32663,
    18820,
    17213,
    32767,
    190,
    0,
    0,
    10,
    34,
    951,
    0,
    1100,
    9525,
    0,
    0,
    0,
    /* articulation 139 */
    19021,
    32558,
    18820,
    23749,
    32767,
    19,
    0,
    0,
    10,
    34,
    988,
    0,
    2000,
    10962,
    0,
    0,
    0,
    /* articulation 140 */
    32767,
    32349,
    18820,
    23749,
    19021,
    634,
    0,
    0,
    10,
    32,
    1008,
    0,
    1200,
    10090,
    0,
    0,
    0,
    /* articulation 141 */
    2536,
    0,
    32767,
    27897,
    1902,
    380,
    0,
    0,
    7,
    34,
    988,
    0,
    1620,
    8933,
    0,
    0,
    0,
    /* articulation 142 */
    32767,
    32349,
    10809,
    23749,
    32767,
    380,
    0,
    0,
    7,
    34,
    988,
    0,
    2200,
    8994,
    0,
    0,
    0,
    /* articulation 143 */
    32767,
    32663,
    15076,
    23749,
    32767,
    1902,
    0,
    0,
    10,
    34,
    982,
    0,
    2500,
    9525,
    0,
    0,
    0,
    /* articulation 144 */
    32767,
    32663,
    15076,
    23749,
    32767,
    190,
    0,
    0,
    10,
    34,
    951,
    0,
    1500,
    11423,
    0,
    0,
    0,
    /* articulation 145 */
    32767,
    32663,
    18820,
    23749,
    32767,
    1902,
    0,
    0,
    9,
    34,
    982,
    0,
    1500,
    9521,
    0,
    0,
    0,
    /* articulation 146 */
    3804,
    0,
    32767,
    28809,
    32767,
    32767,
    32767,
    0,
    0,
    0,
    1521,
    0,
    0,
    9521,
    0,
    0,
    0,
    /* articulation 147 */
    32767,
    32558,
    0,
    23749,
    32767,
    19021,
    0,
    0,
    0,
    17,
    989,
    0,
    5000,
    10223,
    0,
    0,
    0,
    /* articulation 148 */
    32767,
    32663,
    18820,
    23749,
    32767,
    63,
    0,
    0,
    10,
    34,
    951,
    0,
    1500,
    9907,
    0,
    0,
    0,
    /* articulation 149 */
    32767,
    32698,
    11682,
    23749,
    32767,
    1902,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 150 */
    32767,
    32072,
    0,
    32072,
    32767,
    380,
    0,
    0,
    0,
    17,
    989,
    0,
    3440,
    9260,
    0,
    0,
    0,
    /* articulation 151 */
    32767,
    30234,
    0,
    30725,
    32767,
    1902,
    0,
    0,
    0,
    17,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 152 */
    32767,
    31730,
    0,
    30725,
    32767,
    380,
    0,
    0,
    0,
    17,
    989,
    0,
    4000,
    7823,
    0,
    0,
    0,
    /* articulation 153 */
    32767,
    32558,
    3566,
    23749,
    783,
    32767,
    32767,
    0,
    100,
    0,
    1522,
    500,
    0,
    11877,
    0,
    0,
    0,
    /* articulation 154 */
    32767,
    32663,
    18820,
    17213,
    32767,
    1902,
    0,
    0,
    8,
    34,
    989,
    -22,
    0,
    0,
    0,
    0,
    0,
    /* articulation 155 */
    19021,
    29007,
    6784,
    23749,
    32767,
    1902,
    0,
    0,
    0,
    34,
    951,
    0,
    5000,
    9521,
    1,
    0,
    0,
    /* articulation 156 */
    32767,
    32558,
    0,
    31935,
    1902,
    254,
    16384,
    0,
    0,
    52,
    989,
    0,
    3627,
    10547,
    0,
    5,
    0,
    /* articulation 157 */
    3804,
    0,
    32767,
    23749,
    1902,
    1902,
    0,
    0,
    0,
    34,
    989,
    27,
    0,
    11919,
    0,
    0,
    0,
    /* articulation 158 */
    32767,
    0,
    32767,
    31730,
    76,
    66,
    10092,
    0,
    5,
    0,
    989,
    0,
    8007,
    5535,
    0,
    8,
    0,
    /* articulation 159 */
    32767,
    32468,
    0,
    29434,
    32767,
    127,
    0,
    0,
    0,
    52,
    989,
    0,
    2500,
    9032,
    0,
    0,
    0,
    /* articulation 160 */
    9511,
    32663,
    10809,
    25329,
    32767,
    32767,
    32767,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 161 */
    19021,
    32558,
    18820,
    23749,
    32767,
    190,
    0,
    0,
    10,
    34,
    988,
    0,
    2600,
    9513,
    0,
    0,
    0,
    /* articulation 162 */
    32767,
    32106,
    9568,
    23749,
    2348,
    391,
    0,
    0,
    10,
    52,
    980,
    0,
    6500,
    9023,
    0,
    0,
    0,
    /* articulation 163 */
    32767,
    32558,
    0,
    26439,
    32767,
    63,
    0,
    0,
    0,
    34,
    989,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 164 */
    32767,
    32072,
    15076,
    17213,
    32767,
    1268,
    0,
    0,
    0,
    0,
    951,
    0,
    2000,
    10223,
    0,
    0,
    0,
    /* articulation 165 */
    32767,
    32558,
    0,
    23749,
    32767,
    380,
    0,
    0,
    0,
    34,
    989,
    0,
    3000,
    9366,
    0,
    0,
    0,
    /* articulation 166 */
    32767,
    32663,
    18820,
    23749,
    1902,
    127,
    10879,
    0,
    0,
    0,
    989,
    0,
    6000,
    7121,
    0,
    4,
    0,
    /* articulation 167 */
    32767,
    32505,
    0,
    26439,
    32767,
    21,
    0,
    0,
    0,
    52,
    989,
    0,
    3500,
    6236,
    0,
    5,
    0,
    /* articulation 168 */
    32767,
    32505,
    0,
    26439,
    32767,
    190,
    0,
    0,
    0,
    52,
    989,
    0,
    2800,
    7121,
    0,
    0,
    0,
    /* articulation 169 */
    32767,
    32418,
    0,
    29434,
    32767,
    127,
    0,
    0,
    0,
    52,
    989,
    0,
    2100,
    9626,
    0,
    0,
    0,
    /* articulation 170 */
    32767,
    32349,
    0,
    30234,
    32767,
    127,
    0,
    0,
    0,
    52,
    989,
    0,
    3000,
    9626,
    0,
    0,
    0,
    /* articulation 171 */
    32767,
    32288,
    0,
    28400,
    32767,
    127,
    0,
    0,
    0,
    52,
    989,
    0,
    1000,
    9032,
    0,
    0,
    0,
    /* articulation 172 */
    32767,
    32072,
    0,
    28809,
    32767,
    127,
    0,
    0,
    0,
    52,
    989,
    0,
    1000,
    9032,
    0,
    0,
    0,
    /* articulation 173 */
    3804,
    32072,
    15076,
    17213,
    32767,
    1268,
    0,
    0,
    0,
    52,
    991,
    0,
    0,
    11107,
    0,
    8,
    0,
    /* articulation 174 */
    32767,
    32349,
    15076,
    23749,
    7608,
    147,
    0,
    0,
    0,
    0,
    989,
    0,
    4500,
    9521,
    0,
    8,
    0,
    /* articulation 175 */
    32767,
    32663,
    18820,
    23749,
    32767,
    95,
    0,
    0,
    0,
    0,
    989,
    0,
    2000,
    8321,
    0,
    8,
    0,
    /* articulation 176 */
    32767,
    32715,
    128,
    29669,
    32767,
    1729,
    0,
    0,
    0,
    0,
    989,
    0,
    6000,
    7823,
    0,
    8,
    0,
    /* articulation 177 */
    19021,
    32448,
    0,
    31882,
    32767,
    95,
    0,
    0,
    0,
    0,
    989,
    0,
    4500,
    7121,
    0,
    8,
    0,
    /* articulation 178 */
    32767,
    32560,
    3646,
    32107,
    32767,
    190,
    0,
    0,
    0,
    0,
    989,
    0,
    4000,
    8321,
    0,
    8,
    0,
    /* articulation 179 */
    32767,
    32602,
    13644,
    26439,
    32767,
    63,
    0,
    0,
    12,
    34,
    988,
    0,
    2000,
    11107,
    0,
    0,
    0,
    /* articulation 180 */
    19021,
    30484,
    0,
    23749,
    32767,
    1902,
    0,
    0,
    0,
    0,
    989,
    0,
    5000,
    8321,
    1,
    0,
    0,
    /* articulation 181 */
    261,
    32466,
    0,
    31938,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 182 */
    32767,
    32418,
    0,
    31742,
    2348,
    39,
    0,
    0,
    0,
    34,
    989,
    0,
    3600,
    7121,
    0,
    4,
    0,
    /* articulation 183 */
    32767,
    32090,
    0,
    32090,
    32767,
    634,
    0,
    0,
    0,
    34,
    951,
    0,
    0,
    0,
    0,
    0,
    0,
    /* articulation 184 */
    1669,
    32715,
    19242,
    30194,
    32767,
    296,
    0,
    0,
    0,
    0,
    1555,
    0,
    3000,
    9907,
    0,
    4,
    0
  };

  private SonivoxWaveData() {}
}
